package com.br.fsm.projectdelivery.repositorio;
import java.util.ArrayList;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.util.Log;

import com.br.fsm.projectdelivery.activity.R;
import com.br.fsm.projectdelivery.basica.Pedido;
import com.br.fsm.projectdelivery.basica.Pedido.Pedidos;
import com.br.fsm.projectdelivery.excecao.RepositorioException;
import com.br.fsm.projectdelivery.util.Constantes;
import com.br.fsm.projectdelivery.util.Util;

public class RepositorioPedido extends RepositorioBasico implements IRepositorioPedido {

	private static RepositorioPedido instance;	
	
	public static final String TABLE_NAME = "PEDIDO";
	
	public static RepositorioPedido getInstance(){
		if ( instance == null ){
			instance =  new RepositorioPedido();
		} 
		return instance;
	}

	@Override
	public Pedido getPedidoById(int id) throws RepositorioException {
		Cursor cursor = null;
		
		Pedido pedido = null;
		
		try {
			cursor = db.query(TABLE_NAME, Pedido.getColumns(), Pedidos.ID + " = " + id , null,
					null, null, null, null);
			
			if (cursor.moveToFirst()) {
				
				pedido = new Pedido();
				
				int idxId = cursor.getColumnIndex(Pedidos.ID);
				int idxData = cursor.getColumnIndex(Pedidos.DATA);
				int idxValor = cursor.getColumnIndex(Pedidos.VALOR);
				int idxItensCompra = cursor.getColumnIndex(Pedidos.ITENSCOMPRA);
				int idxUltimaAlteracao = cursor.getColumnIndex(Pedidos.ULTIMAALTERACAO);
				
				pedido.setPedidoId(cursor.getInt(idxId));
				pedido.setPedidoData(cursor.getDouble(idxData));
				pedido.setPedidoValor(cursor.getDouble(idxValor));
				pedido.setPedidoItensCompra(cursor.getString(idxItensCompra));
				pedido.setPedidoUltimaAlteracao(Util.convertDateStrToDate(cursor.getString(idxUltimaAlteracao)));
			}
		} catch (Exception e) {
			e.printStackTrace();
			Log.e( Constantes.CATEGORIA , e.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return pedido;
	}

	@Override
	public ArrayList<Pedido> getAllPedido() throws RepositorioException {
		Cursor cursor = null;
		
		ArrayList<Pedido> pedidos = null;
		try {
			pedidos = new ArrayList<Pedido>();
			cursor = db.query(TABLE_NAME, Pedido.getColumns(), null , null,
					null, null, null, null);
			
			if (cursor.moveToFirst()) {
				
				int idxId = cursor.getColumnIndex(Pedidos.ID);
				int idxData = cursor.getColumnIndex(Pedidos.DATA);
				int idxValor = cursor.getColumnIndex(Pedidos.VALOR);
				int idxItensCompra = cursor.getColumnIndex(Pedidos.ITENSCOMPRA);
				int idxUltimaAlteracao = cursor.getColumnIndex(Pedidos.ULTIMAALTERACAO);
									
				do {
					Pedido pedido = new Pedido();
					
					pedido.setPedidoId(cursor.getInt(idxId));
					pedido.setPedidoData(cursor.getDouble(idxData));
					pedido.setPedidoValor(cursor.getDouble(idxValor));
					pedido.setPedidoItensCompra(cursor.getString(idxItensCompra));
					pedido.setPedidoUltimaAlteracao(Util.convertDateStrToDate(cursor.getString(idxUltimaAlteracao)));
					
					pedidos.add(pedido);
				} while (cursor.moveToNext());
				
			}
		} catch (Exception e) {
			e.printStackTrace();			
			Log.e( Constantes.CATEGORIA, e.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return pedidos;
	}

	@Override
	public void insertPedido(Pedido pedido) throws RepositorioException {
		ContentValues values = new ContentValues();

		values.put(Pedidos.DATA, pedido.getPedidoData());
		values.put(Pedidos.VALOR, pedido.getPedidoValor());
		values.put(Pedidos.ITENSCOMPRA, pedido.getPedidoItensCompra());
		String data = Util.convertDateToDateStr(Util.getCurrentDateTime());
		values.put(Pedidos.ULTIMAALTERACAO, data);

		try {
			db.insert(TABLE_NAME, "", values);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}		
	}

	@Override
	public void updatePedido(Pedido pedido) throws RepositorioException {
		ContentValues values = new ContentValues();

		values.put(Pedidos.DATA, pedido.getPedidoData());
		values.put(Pedidos.VALOR, pedido.getPedidoValor());
		values.put(Pedidos.ITENSCOMPRA, pedido.getPedidoItensCompra());
		String data = Util.convertDateToDateStr(Util.getCurrentDateTime());
		values.put(Pedidos.ULTIMAALTERACAO, data);

		String _id = String.valueOf(pedido.getPedidoId());

		String where = Pedidos.ID + "=?";
		String[] whereArgs = new String[] { _id };

		try {
			db.update(TABLE_NAME, values, where, whereArgs);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}
	}

	@Override
	public void removePedido(Pedido pedido) throws RepositorioException {
		String _id = String.valueOf(pedido.getPedidoId());

		String where = Pedidos.ID + "=?";
		String[] whereArgs = new String[] { _id };

		try {
			db.delete( TABLE_NAME, where, whereArgs);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}
	}
}
